iT邦幫忙

2025 iThome 鐵人賽

DAY 2
0

區塊鏈開山始祖 - 比特幣

提到以太坊錢,一定得先講講整個區塊鏈技術的開山始祖「比特幣(Bitcoin)」。中本聰在 2008 年提出比特幣白皮書,隨後在 2009 年正式誕生。起初,比特幣的概念是想要打造一種「去中心化的數位貨幣」。

貨幣的重要性質是作為一種交易媒介、價值儲存媒介,並且能夠被大眾信任。如下圖所示,比特幣的交易(Transaction)可以被看成是狀態轉移,這邊的狀態指得是 UTXO(Unspent Transaction Output)的集合。

透過這種 UTXO 的狀態轉移,透過將狀態如實記錄在某個中心化伺服器或硬碟中,其實就足以構建一個中心化的數位貨幣。

然而,比特幣還想滿足去中心化這個條件,因此需要將狀態轉移儲存在分散式網路中的每個節點當中。那麼,該如何確保每個節點對於整個網路的狀態有一致的認知呢?在比特幣中,以共識演算法 PoW(Proof of Work)確保分散式網路中一致的全局狀態。

儘管比特幣作為數位貨幣十分成功,能夠滿足價值交換、作為交易媒介等需求。然而,隨著整個社群對於去中心化應用程式(dApps)的需求提升,比特幣逐漸不敷使用。當然,比特幣也還有其他問題,如昂貴手續費、容量不足等問題,但此系列文暫不討論。當時,社群主流有三種解決辦法:

  • 建構新的區塊鏈
  • 在比特幣網路上使用腳本
  • 在比特幣網路上建構新的元協定

後來,Vitalik Buerin 在 2014 年提出以太坊白皮書,也就開啟了後續以太坊的蓬勃發展,以及 DeFi、DApp 的大放異彩。

以太坊是什麼?

以太坊起初想解決比特幣對於去中心化應用程式支援不足的問題。透過建構一個新的區塊鏈網路,Vitalik 當初建構以太坊時,便將其設計為一個更具備通用性、能執行圖靈完備程式碼的區塊鏈網路。由此,各種 DApp 與 DeFi 應用項目都能以程式碼的形式執行在以太坊上。

以太坊的狀態轉移:帳戶

前面我們提到,數位貨幣以狀態轉移記錄交易。其中,比特幣透過 UTXO 的集合表示狀態。那麼,以太坊呢?

以太坊的狀態透過帳戶(Account)表示,帳戶可以分為外部帳戶(Externally Owned Account, EOA)以及合約帳戶(Contract Account, CA)。

以太坊帳戶狀態轉移

其中,帳戶本身由以下部分組成:

  • 隨機數
  • 以太幣餘額(Balance)
  • 智能合約程式碼
  • 帳戶儲存空間(Storage)

外部帳戶由私鑰(private key)控制,能夠建立、簽署交易(Transaction),並且發送訊息。

合約帳戶則由智能合約的程式碼控制,收到訊息後,會執行對應的程式碼,能夠讀取、寫入帳戶的儲存空間(Storage),或者是發送訊息、建立新合約。

以太坊的交易與訊息

上一小節提到帳戶能夠建立、簽署交易(Transaction),而交易中會包含已簽署的資料與訊息。

一個典型的以太坊交易會包含:

  • 接收者(Receiver)
  • 發送者的簽名(Signature of Sender)
  • 傳送的以太幣數量
  • 資料
  • STARTGAS:交易執行允許使用的最大計算步驟數量,相當於「工作量」
  • GASPRICE:發送者為每個計算步驟支付的費用,相當於「單價」

因此,一筆交易的手續費(Gas Fee)則為:GAS FEE = STARTGAS * GASPRICE

合約程式碼的執行

合約帳戶中會包含程式碼,那麼,這些程式碼是被如何執行的呢?

以太坊的合約程式碼主要以基於 Stack 的低階組合語言編寫而成,又被稱做 EVM 程式碼,由 EVM 負責執行。大家普遍熟知的合約程式語言 Solidity 是編寫合約的高階語言,會先被編譯為前述的低階組合語言,才能被 EVM 執行。

合約程式碼能存取的資料主要有 1) Stack、2) Memory、3) Storage(也就是前述合約帳戶的儲存空間)。

關於 EVM 跟智能合約程式碼的編寫又能寫好幾篇文章,這邊就此打住。

交易驗證與共識機制

前面幾個小節中,我們知道了以太坊中如何透過帳戶的方式定義狀態,也知道合約帳戶中的程式碼是如何被執行的。那麼,被送上以太坊網路的交易要如何驗證,以及在這樣分散式的網路架構中,各個節點要如何達成共識呢?

以太坊自 2022 年後,底層的共識機制就由 PoW(Proof of Work)轉為 PoS(Proof of Stake),因此本篇文章就先以介紹 PoS 為主。

PoS 的概念是網路中的各個節點如果要擔任驗證者(Validator),必須先 stake(質押)一筆以太幣以成為驗證者。每次 PoS 的共識演算法都會隨機、公平的挑選一個驗證者驗證交易。如此一來,避免了過去 PoW 所有節點都驗證、計算,但最後只有一個節點的 Work 被承認,其他人的運算就被浪費了。

當使用者或合約帳戶產生一筆交易時,該交易會被廣播到以太坊網路上,並且被放入各個節點的 mempool(Memory Pool)中。被挑選的驗證者會挑選一些交易,打包為一個區塊(Block),並且執行狀態轉移函式 APPLY(S,TX) = S'。其中,合約程式碼也在這個狀態轉移的過程中被執行。

以太坊狀態轉移

被挑選的驗證者執行完狀態轉移後,會將結果廣播到網路上,由其他的驗證者負責驗證結果正確無誤。如此,為一個完整的交易驗證流程。

由上,我們也能看出以太坊區塊鏈的區塊(Block)中主要包含了驗證者打包的交易(Transaction)清單。但除此之外,還包含了最新狀態的副本,而這也是以太坊與比特幣在區塊鏈架構上最大的差異。

比特幣網路狀態基於 UTXO(Unspent Transaction Output)的集合,如果要得知某個地址的餘額,需要從創世區塊(Genesis Block)一路推導至最新的區塊。

以太坊則不然,由於其狀態基於帳戶,每次狀態轉移後都會保留一份最新狀態的副本,因此能快速的取得餘額資訊。

結語

本篇文章從區塊鏈的始祖比特幣講起,接著一路介紹以太坊的狀態定義、交易流程、驗證與共識機制。這方面的每一個概念與原理都能夠展開細講,寫成好幾篇文章,不過基於篇幅限制就只在本篇簡單描述。

本文主要參考以太坊白皮書寫成,原始文章寫得比這篇還詳細,非常推薦大家深入閱讀。

明天,我們將開始進入本次系列文的主題「以太坊的擴容之路」,從原理分析以太坊網路在容量上遇到的問題與限制。

參考資料

[1] 以太坊白皮書, 2025


上一篇
Day 1 - 簡介:以太坊擴容之路
下一篇
Day 3 - 交易塞車?從「不可能三角」看區塊鏈的容量瓶頸
系列文
以太坊擴容之路:從 Layer 1 到 Layer 2 的技術全攻略4
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言